package com.guan.mysolutionstudy;

import org.junit.Test;

import java.util.ArrayList;

/**
 * @ClassName LongestPalindrome
 * @Author GuanCary
 * @Date 2020/5/13 13:12
 * @Version 1.0
 * 最长回文字符串
 * Leetcode: LeetCode: 最长回文子串 给定一个字符串 s，找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
 * 输入: "babad"
 * 输出: "bab"
 * 注意: "aba"也是一个有效答案。
 * 输入: "cbbd"
 * 输出: "bb"
 * 思路:找到一个指定字符串中的回文字符串,可以从第一个元素开始遍历,然后区分出中间的回文字符是否重复,既回文字符的奇偶性
 **/
public class LongestPalindrome {
    public String solution(String s) {
        //首先排除字符串过短的情况
        if (0 == s.length()) {
            System.out.println("传入的字符串是空");
        }
        //如果传入的字符串小于2且不为空,那么回文串就是是他自己
        if (s.length() < 2) {
            return s;
        }
        //创建一个保存这个字符串的集合
        ArrayList<String> strings = new ArrayList<String>();
        //fori遍历
        for (int i = 0; i < s.length(); i++) {
            //分离出一个抽象方法,这个方法用来寻找合适的回文字符串
            //奇数字符串,既作为中位数进行比对
            strings.add(findLongestPalindrome(s, i, i));
            //偶数字符串
            strings.add(findLongestPalindrome(s, i, i + 1));
        }
        return strings.toString();

    }

    public String findLongestPalindrome(String s, int strStart, int strEnd) {
        while (true) {
            //首先给出开始的结束的必要界限条件
            if (strStart >= 0 && strEnd < s.length() && (s.charAt(strStart) == s.charAt(strEnd))) {
                //如果两个位数相等,则继续比对
                strStart--;
                strEnd++;
            } else {
                //打印输出然后return
                //这里解释一下,因为strStart在加一的同时不满足条件了,所以我们其实是要取第s.charAt(strStart)的数减小了1
                //所以是取第charAt(strStart+1)的数,然后直接获取index,同理可得回文字符串的长度就是末尾index减去开头index
                //然后再去+1-2就是-1
                int indexStart = strStart + 1;
                int length = strEnd - strStart - 1;
                String temp = null;
                //排除一个字符的干扰,严格意义上一个字符也算是回文字符串,但是我们为了方便验证方法,先排除
                if (length != 0 && length != 1) {
                    temp = s.substring(indexStart, indexStart + length);
                    System.out.println(temp);
                }
                return temp;
            }
        }
    }

    @Test
    public void test() {
        solution("babad");
        solution("cbbd");
    }
}